#include <iostream>

int global_num = 15; // 定义一个全局变量
// int *global_ptr = &global_num;

void changeData(int *ptr)
{
    *(ptr) = 10;
}

void changePtr(int *ptr)
{
    ptr = &global_num;
}

void changeDoublePtr(int **ptr)
{
    int *global_ptr = &global_num;
    *ptr = global_ptr;
}

int main(int argc, char **argv)
{
    int data = 30;
    int *p = &data;
    changeData(p);
    // 有一个问题：指针p和指针ptr是同一个指针吗？
    // changePtr(p);
    // 答案：不是，传参的真正原理是传递一个副本，即在函数内部建立一个指向同一个地址的指针
    // 如果说这个新指针指向了新的位置，仍然对实参指针没有任何影响.
    // 但如果通过新指针改变指向的位置的的一些属性值，这是可以的。

    // 总结:实际上指针也是按值传递，只不过传递的是地址，要想真正改变实参指针的值，要传递指针的指针
    // changeDoublePtr((int **)&p);
    std::cout << *(p) << std::endl;
    return 0;
}
